有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将带有extrastring的意图从活动发送到选项卡片段

我的应用程序的活动层次结构是: 主要活动>;FragActivity>;FragmentExp(它包括3个标签片段(Tab1Tab2Tab3))

我在MainActivity中有回收器视图,当在不同的列表中单击时,我想用额外的字符串(我指的是一些字符串消息)转到Tabs。然后,在标签上显示吐司

我试过的是: 我用extrastring将intent从MainActivity设置为FragActivity,如下所示

 if (position==1){
            Intent i = new Intent(MainActivity.this, FragActivity.class);
            i.putExtra(MainActivity.ENGLISHPDF, "0");
            startActivity(i);
        }

然后直接在Tab1Tab2中获取这些字符串,如下所示:
Tab1

code = getActivity().getIntent().getStringExtra(MainActivity.ENGLISHPDF);
        if (this.code.equals("0")) {
            Toast.makeText(getContext(), "hey its 1", Toast.LENGTH_SHORT).show();
        }

Tab2

code = getActivity().getIntent().getStringExtra(MainActivity.ENGLISHPDF);
        if (this.code.equals("0")) {
            Toast.makeText(getContext(), "hey its 2", Toast.LENGTH_SHORT).show();
        }

以下是我的代码:

主要活动

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, DataAdapter.OnNoteListener{
    public static final String ENGLISHPDF = "english";
    RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        (...)

        recyclerView = findViewById(R.id.add_header);
        (...)

        ArrayList<ListItem> items =  new ArrayList<>();
        items.add(new Item(R.drawable.green, "English", "1"));
        DataAdapter adapter = new DataAdapter(items, this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onNoteClick(int position) {

        if (position==0){
            Intent i = new Intent(MainActivity.this, FragActivity.class);
            i.putExtra(MainActivity.ENGLISHPDF, "0");
            startActivity(i);
        }
       }
    }

FragActivity

public class FragActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frag);


        getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,
                new FragmentExplorem(), COLLAPSING_TOOLBAR_FRAGMENT_TAG).commit();


    }

最后,在FragExp中,我设置了tablayout,并在其中包含了3个标签片段。 这是FragExp:

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_layout, container, false);

        AppBarLayout appBarLayout = view.findViewById(R.id.tab_appbar_layout);
        ((CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams()).setBehavior(new AppBarLayoutBehavior());

        tabLayout = view.findViewById(R.id.tabs);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);

        viewPager = view.findViewById(R.id.viewpager);
        viewPager.setOffscreenPageLimit(tab_count);

        toolbar = view.findViewById(R.id.toolbar);
        setupToolbar();

        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
                viewPager.setCurrentItem(0);
            }
        });
        return view;
    }

    public class MyAdapter extends FragmentPagerAdapter {
        private MyAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }
        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0: return new Tab1();
                case 1: return new Tab2();
                case 2: return new Tab3();
            }
            return null;
        }

        @Override
        public int getCount() {
            return tab_count;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                 case 0 : {
                    return "First";

                }
                case 1 : {
                    return "Second";

                }
                case 2 : {
                    return "Third";
                }

            return null;
        }
    }

共 (1) 个答案

  1. # 1 楼答案

    像下面的函数一样获取片段实例。 这种获取实例的方式确保了所有客户机都需要 实例具有构建片段的相同过程

    public class Tab1 extends Fragment {
    
        private static final String KEY_CODE = "key_code";
    
        public static Fragment newInstance(@Nullable String code) {
            Bundle args = new Bundle(1);
            if (code!= null)
                args.putString(KEY_CODE, code);
    
            Tab1 fragment = new Tab1();
            fragment.setArguments(args);
            return fragment;
        }
    }
    

    当需要Tab1实例时,应该同时传递参数或null

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: return Tab1.newInstance(code);
            case 1: return Tab2.newInstance(code);
            case 2: return Tab3.newInstance(code);
        }
        return null;
    }
    

    然后可以通过调用片段来使用代码。getArguments()

    // In Tab1
    private String mCode;
    
    private String DEFAULT_CODE = "0";
    
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        mCode = getArguments().getString(KEY_CODE , DEFAULT_CODE);
        // Now you can use the mCode in any place in Tab1 you want, but make sure you do Null check before using it
    }
    

    顺便说一句,如果“代码”是动态的,那么它将完全不同